import axios from 'axios'
import type { AxiosInstance, AxiosError, AxiosResponse } from 'axios'
import { ElNotification } from 'element-plus'
const url = import.meta.env.VITE_APP_BASE_API
console.log(url)

// axois实例
const instance: AxiosInstance = axios.create({
  baseURL: url, //请求地址前缀
  timeout: 60 * 1000, //超时时间60s
  headers: {
    contentType: 'application/json;charset=utf-8' //发送或接收JSON数据
  }
})

//请求拦截器
instance.interceptors.request.use(
  (config) => {
    config.headers['Authorization'] = localStorage.getItem('token')
    return config
  },
  (error: AxiosError) => {
    return Promise.reject(error)
  }
)

//常见HTTP错误码列表
const ERR_CODE_LIST: { [propName: string]: string } = {
  400: '请求错误',
  401: '登录失效或在其他地方已登录',
  403: '拒绝访问',
  404: '请求地址出错',
  408: '请求超时',
  500: '服务器内部错误',
  501: '服务未实现',
  502: '网关错误',
  503: '服务不可用',
  504: '网关超时',
  505: 'HTTP版本不受支持'
}

//响应拦截器
instance.interceptors.response.use(
  (res: AxiosResponse) => {
    // 如果返回数据的状态码不是20x，即提示错误
    if (!String(res.data?.statusCode)?.startsWith('20') && res.data?.message) {
      ElNotification.error(res.data.message)
    }
    // res是Axois默认返回的数据结构，res.data才是真正后端返回的数据
    return Promise.resolve(res.data)
  },
  (err: AxiosError) => {
    if (!err.response) {
      ElNotification.error('网络不可用，请刷新重试')
      return
    }
    // 提示HTTP请求异常信息
    const { status } = err.response
    if (ERR_CODE_LIST[status]) {
      ElNotification.error(ERR_CODE_LIST[status])
    }
  }
)

export default instance
